package com.cmxh.shipper.util;

import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 只要是@Controller修饰类 方法抛出的异常 都会进入这个类的
 */
@ControllerAdvice
public class MyExceptionHandler {


    @ExceptionHandler(MethodArgumentNotValidException.class)
    // 将Result格式化成json字符串
    @ResponseBody
    public Result xx01(MethodArgumentNotValidException e){

        // 拿到我们校验失败的异常信息
        Map<String,String> mm = new HashMap<>();// 存放异常信息
        // 将读取到的异常信息存放在mm这个集合中

        // Field:属性  name  money  mima
        // 但凡有一个属性校验失败了 我就会往fieldErrors添加一条校验失败的信息

        List<FieldError> fieldErrors =e.getBindingResult().getFieldErrors();
        for(FieldError xx:fieldErrors){
            String field = xx.getField();// 属性名
            String defaultMessage = xx.getDefaultMessage();// 校验失败信息 message的值

            mm.put(field,defaultMessage);
        }


        e.printStackTrace();// 将web层抛出的异常捕获，并且打印在控制台(以后会把异常信息打印在文件中)
        return new Result(Code.NULL_ERR,mm,"校验失败");
    }



//    /**
//     * 只要Controller层的方法抛出的异常 不管是何种类型的异常 都走这个代码
//     * 不管我们抛出何种异常 都是Exception类的子类
//     * @return
//     */
//    @ExceptionHandler(Exception.class)
//    // 将Result格式化成json字符串
//    @ResponseBody
//    public Result xx(Exception e){
//        e.printStackTrace();// 将web层抛出的异常捕获，并且打印在控制台(以后会把异常信息打印在文件中)
//        return new Result(Code.NULL_ERR,"服务器出问题了,稍后再试");
//    }





}
